查看原文
其他

东芝开发板驱动OLED模块显示LOGO图片

wcc149 电子电路开发学习 2021-01-31


前言

在之前的两篇评测文章:

介绍了系统SysTick实现精确延时,GPIO的输入输出使用,并实现了位带方式操作GPIO,大大简化了GPIO的输入输出控制。有了精确延时函数+GPIO控制,那么就可以使用通用GPIO模拟的方式,来驱动各种接口的显示器件传感器等。本文以通用GPIO模拟IIC协议,来驱动0.96寸OLED模块为例,来实现OLED显示字符、LOGO图片等等。

OLED屏简介

对于显示屏,我想大家首先想到的是LCD液晶,而OLED显示屏属于新型显示器件,被称为“梦幻显示器”,相比于AMOLED具有反应速度较快、对比度更高、视角较广等特点。

优点

  • 无需背光灯,可以做的更薄,厚度可以控制在1mm以内,而LCD屏幕厚度通常在3mm左右

  • 面板自主发光,显示黑色几乎不耗电,可以自由弯曲,功耗低,视角广。

  • 反应速度是LCD屏幕的千分之一,显示色彩更丰富,更亮,在白天户外也可以清晰的看到屏幕。

  • 耐低温,可以在-40℃环境下正常显示内容。

缺点

  • 相比LCD屏幕,OLED制造技术还不够成熟,量产率低、成本高

  • 早期存在烧屏、红线等寿命较短的问题,但是经过不断改良和研发,现在的OLED屏幕已经相当成熟、稳定。

  • 价格还是偏贵,以国产中景园的0.96寸单色OLED,价格在15RMB左右,而全彩的同尺寸OLED模块,价格在40RMB。

这次我使用的是这种0.96寸的OLED模块,驱动芯片是SSD1306,支持SPI、IIC、8080并口3种通信协议,显示颜色上有蓝色、白色、黄蓝黄色两种,其中黄蓝双色是指上面1/4是黄色,下面3/4是蓝色,并不是真正意义上的双色显示。我手上的这款是0.96寸IIC接口蓝色的OLED模块,只需要两根数据线和两根电源线就可以直接驱动,非常方便。

OLED的初始化

由于IIC协议的两根线,必须加上拉电阻才能之后使用,而模块本身已经添加了10K的上拉电阻,所以连接开发板时,只要选择任意两个GPIO即可,这里我使用的是SDA - PN2、SCL - PN4两个引脚,对应原理图中的CN7的3脚和1脚。由于我的这款OLED模块做工比较简单,没有带5v转3.3v的的转换芯片,所以只能使用3.3v来供电,不能直接使用5v供电,否则可以会烧坏模块,当然,如果你的模块已经带了5-3.3的芯片,那么可以直接使用5v供电。其中SCL引脚使用过程中始终为输出模式,而SDA引脚在写数据时配置为输出模式,在读数据时需要配置为输入模式。数据的输出和读取输入,这里使用了上一篇文章中介绍的位带操作方式实现的。

SCL和SDA的宏定义配置

  1. #ifndef __OLED_IIC_H__

  2. #define __OLED_IIC_H__


  3. #include "bsp.h"


  4. //SDA - PN2

  5. //SCL - PN4


  6. #define OLED_IIC_SDA_PORT GPIO_PORT_N

  7. #define OLED_IIC_SCL_PORT GPIO_PORT_N


  8. #define OLED_IIC_SDA_PIN GPIO_PORT_2

  9. #define OLED_IIC_SCL_PIN GPIO_PORT_4


  10. #define OLED_IIC_SCL_OUTPUT_FUN GPIO_PN4_OUTPUT


  11. #define OLED_IIC_SDA_INPUT_FUN GPIO_PN2_INPUT

  12. #define OLED_IIC_SDA_OUTPUT_FUN GPIO_PN2_OUTPUT

  13. //配置输入输出模式

  14. #define OLED_SDA_IN() gpio_func(&port, OLED_IIC_SDA_PORT, OLED_IIC_SDA_PIN, OLED_IIC_SDA_INPUT_FUN, GPIO_PIN_INPUT) //输入模式

  15. #define OLED_SDA_OUT() gpio_func(&port, OLED_IIC_SDA_PORT, OLED_IIC_SDA_PIN, OLED_IIC_SDA_OUTPUT_FUN, GPIO_PIN_OUTPUT)


  16. //位带方式操作IO

  17. #define OLED_IIC_SCL PNout(4) //SCL

  18. #define OLED_IIC_SDA PNout(2) //SDA

  19. #define OLED_READ_SDA PNin(2) //输入SDA


  20. #endif

IIC协议初始化

  1. //初始化IIC

  2. void OLED_IIC_Init(void)

  3. {

  4. port.p_pn_instance = TSB_PN; //PN时钟使能


  5. gpio_init(&port, OLED_IIC_SDA_PORT);

  6. gpio_init(&port, OLED_IIC_SCL_PORT);


  7. gpio_func(&port, OLED_IIC_SDA_PORT, OLED_IIC_SDA_PIN, OLED_IIC_SDA_OUTPUT_FUN, GPIO_PIN_OUTPUT);

  8. gpio_func(&port, OLED_IIC_SCL_PORT, OLED_IIC_SCL_PIN, OLED_IIC_SCL_OUTPUT_FUN, GPIO_PIN_OUTPUT);


  9. OLED_IIC_SCL = 1;

  10. OLED_IIC_SDA = 1;

  11. }

限于文章篇幅,这里不贴出完整的底层驱动代码,可以到文末下载示例工程代码

显示BMP图片的函数:

  1. //显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~8

  2. void OLED_DrawBMP(u8 x0, u8 y0, u8 x1, u8 y1,const u8 BMPx[])

  3. {

  4. u16 j = 0;

  5. u8 x, y;


  6. if(y1 % 8 == 0) y = y1 / 8;

  7. else y = y1 / 8 + 1;

  8. for(y = y0; y < y1; y++)

  9. {

  10. OLED_Set_Pos(x0, y);

  11. for(x = x0; x < x1; x++)

  12. {

  13. OLED_WriteData(BMPx[j++]);

  14. }

  15. }

  16. }

开机LOGO的显示

  1. void Display_LOGO(void)

  2. {

  3. u8 n;


  4. OLED_DrawBMP(0, 0, 128, 8, TOSHIBA); //东芝LOGO全屏显示


  5. OLED_DisString_F8X16(0, 3, "Starting...");

  6. for( n = 5; n > 0; n--)

  7. {

  8. OLED_DisNumber_F8X16(12, 3, n); //启动倒计时

  9. delay_ms(800);

  10. }

  11. OLED_Clear();//清屏

  12. OLED_DrawBMP(0, 0, 128, 8, TT_M3HQ); //TT_M3HQ全屏显示

  13. delay_ms(200);

  14. OLED_Clear();//清屏

  15. OLED_DrawBMP(0, 0, 128, 8, THUNDER); //中科创达LOGO全屏显示

  16. delay_ms(200);

  17. OLED_Clear();//清屏

  18. OLED_DrawBMP(0, 0, 128, 8, MBB); //面包板社区LOGO全屏显示

  19. delay_ms(800);

  20. OLED_Clear();//清屏

  21. OLED_DrawBMP(0, 0, 128, 2, BAR); //上1/4仿手机状态栏显示

  22. }

BMP单色位图图片数据的取模

1.准备1张小于128*64像素的单色位图图片

即在图片详细信息中如下信息,颜色位深度为1,大小一般在1KB左右。

2.取模方式的配置

图片取模说明:阴码,列行式,逆向,点阵16*16,其中阴码、列行式、逆向,这几个配置要根据你的OLED驱动函数中的来修改,如果显示不正确,需要对应修改。

3.生成图片字模数据

点击生成字模数据,即可生成图片对应的C语言格式的字模数据。

几个BMP格式的LOGO图片

东芝半导体LOGO

中科创达LOGO

面包板社区LOGO

实际显示效果

显示东芝半导体LOGO

显示中科创达LOGO

显示面包板社区LOGO

仿手机状态栏

源码下载

  • Github开源地址:

    https://github.com/whik/TTM3HQOLED_Demo.git

  • Gitee码云开源地址:

    https://gitee.com/whik/TTM3HQOLED_Demo.git

  • 直接下载:TT_M3HQ_OLED_Demo


推荐阅读


  • 我的博客:www.wangchaochao.top

  • 我的公众号:mcu149

由于微信文章不支持超链接,文中出现的软件、程序等文件下载,可以点击"阅读原文",跳转到我的博客文章进行下载。


原创不易,如果觉得我的文章对你有所帮助,可以随手点“好看”分享,你的支持将是我持续更新的动力。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存